// 版权归 瞄你个汪 所有。使用本代码应遵守相关法律法规和Apache 2.0开源许可要求。
package top.geeke.toolkit.http;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;
import org.springframework.util.ObjectUtils;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
 * <p>
 * Http 分页查询输入参数
 * </p>
 * @author 瞄你个汪
 * @since 2024-05-01 12:00:00
 */
@Data
public class PageInput<S> {
    /**
     * 查询条件
     */
    @Valid
    private S search;
    /**
     * 页容量
     */
    @Min(value = 1, message = "页容量不能小于1")
    private long size = 10;
    /**
     * 当前页
     */
    @Min(value = 1, message = "当前页不能小于1")
    private long page = 1;
    /**
     * 排序字段
     */
    private List<OrderItem> orders;

    public <R> IPage<R> getPage() {
        Page<R> page = new Page<>(this.page, size);
        page.setOrders(orders);
        page.setMaxLimit(500L);
        return page;
    }

    /**
     * 传递分页参数并设置查询记录
     */
    public <R> IPage<R> reader(Function<IPage<R>, List<R>> func) {
        IPage<R> page = getPage();
        return page.setRecords(func.apply(page));
    }

    /**
     * 传递分页参数并设置查询记录
     */
    public <R> IPage<R> reader(BiFunction<IPage<R>, QueryWrapper<R>, List<R>> func) {
        IPage<R> page = getPage();
        return page.setRecords(func.apply(page, new QueryWrapper<>()));
    }

    /**
     *  带查询条件传递分页参数并设置查询记录
     */
    public <R> IPage<R> reader(BiConsumer<QueryWrapper<R>, S> searchFunc, BiFunction<IPage<R>, QueryWrapper<R>, List<R>> func) {
        IPage<R> page = getPage();
        QueryWrapper<R> query = new QueryWrapper<>();
        if (!ObjectUtils.isEmpty(search)) searchFunc.accept(query, search);
        return page.setRecords(func.apply(page, query));
    }
}
